小编bea*_*ain的帖子

swift子类*总是*必须调用super.init()

如果我有一个swift子类:

  1. 不需要访问 self
  2. 不需要访问任何属性 self

我还需要调用super.init()子类的init()方法吗?

*注意:由于上面1和2中列出的细节,这个问题与SO上提出并回答的问题不同.

inheritance swift

28
推荐指数
3
解决办法
1万
查看次数

如何使用可变参数转发函数?

在Swift中,如何将数组转换为元组?

问题出现了,因为我试图调用一个函数,该函数在一个带有可变数量参数的函数中接受可变数量的参数.

// Function 1
func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}
// Example Usage
sumOf(2, 5, 1)

// Function 2
func averageOf(numbers: Int...) -> Int {
    return sumOf(numbers) / numbers.count
}
Run Code Online (Sandbox Code Playgroud)

这个averageOf实现对我来说似乎很合理,但它不能编译.当您尝试调用时,它会出现以下错误sumOf(numbers):

Could not find an overload for '__converstion' that accepts the supplied arguments
Run Code Online (Sandbox Code Playgroud)

里面averageOf,numbers有类型Int[].我相信sumOf期待一个元组而不是阵列.

因此,在Swift中,如何将数组转换为元组?

arrays variadic-functions swift

22
推荐指数
1
解决办法
4274
查看次数

在ARC下,当直接分配给ivar时,是否会自动复制块?

在ARC下面假设以下代码,

typedef void (^MyResponseHandler) (NSError *error);
@interface MyClass : NSObject
{
    MyResponseHandler _ivarResponseHandler;
}

- (void)myMethod:(MyResponseHandler)responseHandler
{
    _ivarResponseHandler = responseHandler;
    ...
}
Run Code Online (Sandbox Code Playgroud)

问题:当分配给ivar时,块是否自动复制到堆中?

我之前的问题暗示它是在通过a分配时复制的@property.但是,今天我使用了上面的代码并收到了EXC_BAD_ACCESS修改后修改的代码

_ivarResponseHandler = [responseHandler copy].

objective-c objective-c-blocks ivar automatic-ref-counting

20
推荐指数
2
解决办法
5179
查看次数

如何裁剪UIImage而不失去它的规模属性?

目标:裁剪a UIImage(scale以2.0 的属性开头)

我执行以下代码:

let croppedCGImage = originalUIImage.cgImage!.cropping(to: cropRect)
let croppedUIImage = UIImage(cgImage: croppedCGImage!)
Run Code Online (Sandbox Code Playgroud)

此代码有效,但结果croppedUIImagescale属性不正确为1.0.


我已经尝试过指定scale创建最终图像的时间:

let croppedUIImage = UIImage(cgImage: croppedCGImage!, scale: 2.0, orientation: .up)
Run Code Online (Sandbox Code Playgroud)

这会产生正确的比例,但它会将size尺寸缩小一半.


我该怎么办?

(*注意:scaleUIImage上的属性很重要,因为我稍后会保存UIImagePNGRepresentation(_ image: UIImage)scale属性影响的图像)



编辑:

我得到以下工作.不幸的是,它比CGImage裁剪功能慢得多.

extension UIImage {
    func cropping(to rect: CGRect) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(rect.size, false, self.scale)

        self.draw(in: CGRect(x: -rect.origin.x, y: -rect.origin.y, width: self.size.width, height: self.size.height))

        let croppedImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()

        return croppedImage …
Run Code Online (Sandbox Code Playgroud)

core-graphics uiimage cgimage ios swift

15
推荐指数
3
解决办法
3105
查看次数

ARC - 分配成强大的财产.泄漏?

在ARC,它创建一个内存泄漏到alloc@property (strong)

// MyClass.h
@property (strong) NSString *myString;

// MyClass.m
@synthesize myString=_myString;

- (void)viewDidLoad
{
    self.myString = [[NSString alloc] initWithFormat:@"Test %@", otherString];
}
Run Code Online (Sandbox Code Playgroud)

我知道在手动内存管理中,等效会造成泄漏

// MyClass.h
@property (retain) NSString *myString;

// MyClass.m
@synthesize myString=_myString;

- (void)viewDidLoad
{
    self.myString = [[NSString alloc] initWithFormat:@"Test %@", otherString];
}

- (void)dealloc
{
    [_myString release];
}
Run Code Online (Sandbox Code Playgroud)

ARC能否正确处理顶级示例?它是否优化了其中一个保留?或者也许在dealloc中发布两次?

cocoa memory-management objective-c automatic-ref-counting

14
推荐指数
1
解决办法
3173
查看次数

在ARC下,当通过属性分配给ivar时,是否会自动复制块?

假设

typedef void (^MyResponseHandler) (NSError *error);
@property (strong, nonatomic) MyResponseHandler ivarResponseHandler;
synthesize ivarResponseHandler = _ivarResponseHandler;

- (void)myMethod:(MyResponseHandler)responseHandler
{
    self.ivarResponseHandler = responseHandler;
    ...
}
Run Code Online (Sandbox Code Playgroud)

通过@property正确的方式分配给ivar 吗?我知道在手动内存管理中你需要self.ivarResponseHandler = [responseHandler copy];确保将块从堆栈复制到堆中.但是,观看会议322 - 来自WWDC 2011的会议-C深度进展(第25分钟),发言人说ARC自动处理将块分配给ivar.我只是想确定一下.

properties objective-c objective-c-blocks automatic-ref-counting

8
推荐指数
2
解决办法
2659
查看次数

insertRowsAtIndexPaths:with scrollToRowAtIndexPath:导致UITableView部分被错误地隐藏

我创建了一个UITableview,其中包含可点击的部分.当你点击它们时

  1. 他们"扩大"以揭示其中的细胞
  2. 单击的部分滚动到视图的顶部.

我计算所有索引路径以插入/删除必要的单元格,然后使用以下代码插入它们:

[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:pathsToOpen withRowAnimation:insertAnimation];
[self.tableView deleteRowsAtIndexPaths:pathsToClose withRowAnimation:deleteAnimation];
[self.tableView endUpdates];
[self.tableView scrollToRowAtIndexPath:[pathsToOpen objectAtIndex:0]  atScrollPosition:UITableViewScrollPositionTop animated:YES];
Run Code Online (Sandbox Code Playgroud)

只有一个问题 - 所选部分下面的部分是隐藏的.第一个屏幕截图显示了tableview的外观.第二个屏幕截图显示了它的实际外观.

部分消失

如果向上滚动(所以隐藏的部分在屏幕外),然后向下滚动,隐藏的部分将被带回(再次可见).我猜测为什么会发生这种情况如下:

插入/删除动画scrollToRowAtIndexPath与TableView 同时发生并且令人困惑.如果我没有完成scrollToRowAtIndexPath第3和第4部分就会出现在屏幕外 - 所以tableView仍然认为它们是在屏幕外.UITableview将屏幕外的单元格/部分隐藏为优化.如果我请scrollToRowAtIndexPathdispatch_after用2秒钟,然后第3及4被正确显示.

所以我想我知道为什么会这样,但我不知道如何修复/覆盖这个UITableview优化.实际上,如果我scrollViewDidEndScrollingAnimation在此函数中实现然后添加断点,则应用程序会正确显示第3和第4部分(这就是我第一次进行屏幕截图).但是一旦继续这个功能,细胞就会消失.

完整的项目可以在这里下载


其他实现细节:Sections是合法的UITableView部分.我添加了一个tapGestureRecognizer,用于触发对tableview的委托回调.下面包含打开这些部分的整个方法.

- (void)sectionHeaderView:(SectionHeaderView *)sectionHeaderView sectionOpened:(NSInteger)sectionOpened
{
    // Open
    sectionHeaderView.numRows = DefaultNumRows;
    sectionHeaderView.selected = YES;
    NSMutableArray *pathsToOpen = [[NSMutableArray alloc] init];
    for (int i = 0; i < sectionHeaderView.numRows; i++)
    {
        NSIndexPath *pathToOpen = [NSIndexPath indexPathForRow:i inSection:sectionOpened];
        [pathsToOpen addObject:pathToOpen];
    } …
Run Code Online (Sandbox Code Playgroud)

cocoa-touch uitableview uikit ios

5
推荐指数
2
解决办法
2868
查看次数

在Xcode中编译有效文件引用的时间检查

是否可以强制Xcode编译器验证代码中引用的文件是否有效?

当您通过NSString以编程方式自然引用文件时,Cocoa开发中有多个要点:

[UINib nibWithNibName:@"MyNib" bundle:nil];
[UIImage imageNamed:@"MyImage"];
[[UIViewController alloc] initWithNibName:@"MyNib" bundle:nil];
Run Code Online (Sandbox Code Playgroud)

有没有办法在编译时检查这些文件引用是否有效?

通常在使用上述方法之后,我最终会更改引用文件的名称,但忘记在代码中更改名称.一切都顺从,没有问题,只有当你碰巧去访问该文件的应用程序部分时,bug才会显露出来.

是否有人们用来避免这种错误的另一种方法或技术?
通过字符串引用文件名感觉非常脆弱.

compiler-construction xcode objective-c llvm-clang ios

5
推荐指数
1
解决办法
733
查看次数

为什么iPhone示例代码使用了这么多中间变量?

我目前正在研究Apress的"开始iPhone 3开发".他们在示例应用程序中使用的标准类似于以下代码:

- (void)viewDidLoad {
    BlueViewController *blueController = [[BlueViewController alloc] 
                                         initWithNibName:@"BlueView" bundle:nil];
    self.blueViewController = blueController;
    [self.view insertSubview:blueController.view atIndex:0];
    [blueController release];
}
Run Code Online (Sandbox Code Playgroud)

8.14.11 UPDATE(附加信息)
blueViewController声明如下:

@property (retain, nonatomic) BlueViewController *blueViewController;
Run Code Online (Sandbox Code Playgroud)

每当他们执行一个alloc他们把它放在一些临时变量(这里blueController)然后他们分配它,然后他们释放它.这个临时变量对我来说似乎是多余的.
我将代码简化如下:

- (void)viewDidLoad {
    self.blueViewController = [[BlueViewController alloc] 
                              initWithNibName:@"BlueView" bundle:nil];
    [self.view insertSubview:blueViewController.view atIndex:0];
}

- (void)dealloc {
    [blueViewController release];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

我的修改后的代码在iPhone模拟器中运行完全相同.现在,我知道规则,如果你分配一些东西,你需要释放它.我在我的dealloc方法中涵盖了这一点.但是直接在ViewDidLoad(alloc被调用的函数)中释放是否有一些优势?或者release在这样的dealloc方法中同样可以吗?
谢谢你的帮助,
-j

memory-management objective-c simplification ios

3
推荐指数
1
解决办法
241
查看次数

动画 CALayer 蒙版的蒙版

目标:
我正在绘制一个具有渐变的自定义形状。我还想通过从左到右绘制来为该形状的绘图设置动画。

问题:
下面的代码适用于 iPad 模拟器,但不适用于我运行 iOS 7 的 iPad 4。有谁知道如何在设备上进行这项工作?有没有不同的方法来达到同样的结果?

我的代码说明:
我的代码使用 3 个 CALayer 工作(仅在模拟器上)。

  • gradientLayer 保持我的渐变。
  • shapeMaskLayer 保持我的自定义形状。
  • animationMaskLayer 动画它的路径以模拟从左到右的绘图

animationMaskLayer --masks--> shapeMaskLayer --masks--> gradientLayer

然后我为 的框架设置动画animationMaskLayer以设置整个形状的动画。

代码:

// Animation Mask Rects
CGPathRef leftStartingRectPath = CGPathCreateWithRect(CGRectMake(0, 0, 0, self.frame.size.height), 0);
CGPathRef fullViewRectPath = CGPathCreateWithRect(CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), 0);

// Animation Mask Layer
CAShapeLayer *animationMaskLayer = [CAShapeLayer layer];
animationMaskLayer.path = fullViewRectPath;
animationMaskLayer.fillColor = UIColor.blackColor.CGColor;

// Shape Mask Layer
CAShapeLayer *shapeMaskLayer = [CAShapeLayer layer];
shapeMaskLayer.path = CGPathCreateWithEllipseInRect(self.bounds, …
Run Code Online (Sandbox Code Playgroud)

animation core-animation objective-c ios

3
推荐指数
1
解决办法
2555
查看次数