在observeValueForKeyPath:ofObject:change:context:- 为什么文档使用NULL而不是nil在不指定上下文指针时?
当我respondsToSelector在ARC环境中调用时,收到以下错误消息Automatic Reference Counting Issue No known instance method for selector respondsToSelector:
这是标题
#import <AppKit/AppKit.h>
@class MTScrollView;
@protocol MTScrollViewDelegate
-(void)scrollViewDidScroll:(MTScrollView *)scrollView;
@end
@interface MTScrollView : NSScrollView
{
}
@property(nonatomic, weak) id<MTScrollViewDelegate>delegate;
@end
Run Code Online (Sandbox Code Playgroud)
这是实现文件
#import "MTScrollView.h"
@implementation MTScrollView
@synthesize delegate;
- (void)reflectScrolledClipView:(NSClipView *)aClipView
{
[super reflectScrolledClipView:aClipView];
if([delegate respondsToSelector:@selector(scrollViewDidScroll:)])
{
[delegate scrollViewDidScroll:self];
}
}
@end
Run Code Online (Sandbox Code Playgroud)
有关我为什么会收到此错误的任何建议?
在Objective-C中,声明变量id与声明变量之间的区别是什么NSObject *?
我知道有很多关于指针的问题,特别是现在的Objective-C.但我正在寻找一些更高级别的答案来帮助我理解Objective-C中的范例.
我听说有人说在Objective-C中使用指针是一个问题或经验,即有些类要求你使用指针,有些则不然.这是真的?这是在Objective-C中使用指针的程度.
基本上,除了想要将引用变量显式传递给方法之外,Objective-C中指针的规则是什么?
void*是C和衍生语言的一个有用的特性.例如,可以使用void*在C++类中存储objective-C对象指针.
我最近正在研究类型转换框架,由于时间限制有点懒 - 所以我用void*...这就是这个问题出现的原因:
为什么我可以将int转换为void*,但不能浮动到void*?
我一直想知道为什么Apple在Core Foundation中使用了类型为指针类型的数据类型,而在Cocoa中却没有.
作为一个例子,你会引用一个UIColor对象,就像UIColor *对CGColor对象的引用一样CGColorRef?还是NSURL *和CFURLRef?为什么不总是使用CGColor *和CFURL *?或者相反,为什么没有UIColorRef或NSURLRef类型,因为你从来没有访问UIColor或NSURL直接访问?
或者例如,它为什么id而不是id *,因为它实际上是一个指针,实际上可以强制转换为void *?
具体来说,是否有一些原因让Apple习惯在旧框架中执行此操作,但是在Cocoa中停止了这样做?这只是风格问题吗?
在Objective C中,id与void *C 完全相同?(通用指针类型).
如果是这样,我们使用的时候
id obj = [[Fraction alloc] init];
[obj methodName];
obj = [[ComplexNumber alloc] init];
[obj anotherMethodName];
Run Code Online (Sandbox Code Playgroud)
当调用该方法时,程序以什么方式知道哪个类obj是什么?
可能重复:
id和void之间的客观c差异*
例如,UIView动画委托回调方法具有以下参数:
context:(void*)context
Run Code Online (Sandbox Code Playgroud)
为什么不简单的id?如果我不关心语境,我总是通过nil.但是当我想要一个时,我会传递这个对象.有什么不同?为什么他们喜欢void*over id?
在Objective-C中,"(UIButton*)发送者"是什么意思,为什么它不是"UIButton*sender"?或者一些NSObject代替UIButton.这更像是关于星号优先级的问题......
- (IBAction)digitPressed:(UIButton *)sender {
//...
}
Run Code Online (Sandbox Code Playgroud) 我试图在objective-c中理解这一点:
在这个例子中,indexPath是一个指针,但我们在函数中"按原样"使用它:indexPath.section而不是(例如)*indexPath.section(带有*):
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
return (indexPath.section == 0) ? nil : indexPath;
}
Run Code Online (Sandbox Code Playgroud)
所以,在objective-c中,我们不需要添加一个*来获取指针所指向的变量的内容......?
但是我找到了这个函数,它们*在函数内部使用了一个指针(on reverse):
NSInteger lastNameFirstNameSort(id person1, id person2, void *reverse)
{
NSString *name1 = [person1 valueForKey:LAST];
//...
if (*(BOOL *)reverse == YES) {
return 0 - comparison;
}
Run Code Online (Sandbox Code Playgroud)
对于id变量,它们使用变量名称:例如:person1
那么,有人可以解释一下这两个例子之间的区别:
为什么在第一个例子中,我们不添加一个*关于indexPath,
为什么我们不在变量*上添加它id,我们*reverse在第二个例子中使用它?
谢谢
创建新对象并初始化时,为什么要使用id?我们不能使用(NSObject*)吗?