id
is generic. By using id
you're telling the compiler that you will fill in details about usage later. The compiler assumes that any code you have is correct and doesn't warn you about anything. At runtime checks are made to verify what you're trying to do and you will get an exception if your code is wrong.
NSObject
is specific. By using NSObject
you're telling the compiler exactly what the object is. When you try to call methods on it they will be checked against what NSObject
understands. You will get compile time errors if you make a mistake.
All that said, you can just cast in both cases to get to another Class type.
Your concern is what you're going to do with the reference in the future. Generally, using NSObject
doesn't have any benefits.